package p12_jdk代理原理;

/**
 * 09节中，学习了jdk的动态代理，生成的代理类是由ASM技术动态生成的
 * 那么生成的代理类长啥样呢？
 * 这节学习jdk生成的代理类的结构
 */
public class $jdk代理 {
    public static void main(String[] args) {
        Target target = new Target();
        /**
         * $Proxy0是我们定义的代理类，不过这个代理类是写死的，spring的代理类是运行时动态生成的
         * 不过$Proxy0虽然是写死的，但是原理和spring的代理类是一样的
         */
        $Proxy0 $proxy0 = new $Proxy0(((proxy, method, args1) -> {
            //我们可以自定义增强的代码
            System.out.println("before...");
            //这里可知，在代理类内部，是通过反射来调用目标类方法
            //jdk代理有一个优化，当调用次数够多，这里的反射就会被优化成正常调用(也是通过生成代理类)
            Object result = method.invoke(target, args1);
            System.out.println("after...");
            return result;
        }));

        System.out.println($proxy0.bar());
        $proxy0.foo();
    }
}
